package com.springcloud.controller;

import com.wukc.springcloud.domain.CommonResult;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @Author: wukc
 * @Description: TODO
 * @DateTime: 2022/1/5 11:09
 **/
@RestController
@RefreshScope   //支持nacos动态刷新
public class UploadController {

    private final static Logger logger = LoggerFactory.getLogger("UploadController");

    //文件类型白名单
    @Value("${whiteList.info}")
    private String whiteList;

    //上传文件路径
    @Value("${fileUpload.info}")
    private String path;

    @RequestMapping("/uploadFile.do")
    public CommonResult uploadFile(MultipartFile file) throws Exception {
        //生成uuid作为文件的唯一标识
        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        // 获取文件原始名称
        String originName = file.getOriginalFilename();
        //  获取文件后缀名
        String suffix = FilenameUtils.getExtension(originName);
        //  过滤文件
        if(whiteList.indexOf(suffix)<0&&whiteList.toUpperCase().indexOf(suffix)<0){
            System.out.println("------文件不合法-------");
            throw new Exception("------文件不合法-------");
        }
        // 生成新的文件名，以uuid+原始名称的后缀拼接而成；
        String newName = uuid + "-" + originName;
        // 创建文件保存路径的文件目录
        File filex = new File(path);
        if (!filex.exists() && !filex.isDirectory()) {//若上传目录不存在，则创建目录
            filex.mkdirs();
        }
        // 文件转流，并关闭流，执行各种操作
        InputStream is = null;
        FileOutputStream fos = null;
        byte[] buffer = new byte[100 * 1024];//根据上传文件大小设定
        is = file.getInputStream();// 获得上传文件流
        //创建文件输出流  使用FileOutputStream打开服务器端的上传文件
        fos = new FileOutputStream(path + newName);
        int len = 0;
        //开始读取上传文件的字节，并将其输出到服务端的上传文件输出流中
        //循环将输入流读入到缓冲区当中，(len=in.read(buffer))>0就表示in里面还有数据
        while ((len = is.read(buffer)) > 0) {
            fos.write(buffer, 0, len);//写入到指定的目录当中
        }
        fos.flush();
        is.close();
        fos.close();

        //返回前端的数据
        Map<String, String> map = new HashMap<>();
        //存入数据
        // 初始文件名作为返回的文件名
        map.put("fileName", originName);
        // 路径+新的文件名作为文件的存储位置
        String abFilePath = path + newName;
        // 获取盘符，如果有的话
        String disk = null;
        if (abFilePath.contains(":")) {
            // 将路径的前两位替换为点号，并将盘符也返回
            String[] s = abFilePath.split(":");
            // 获取盘符
            disk = s[0];
        }
        // 返回路径
        map.put("filePath", abFilePath);
        map.put("uuid", uuid);
        logger.info("上传成功------"+uuid+"-----"+originName);

        return new CommonResult(200,"上传成功",map);
    }
}
